#define _CRT_SECURE_NO_WARNINGS

//猜数字游戏：
//电脑自动随机生成0-100的数字，用户输入数字，电脑给出大了或者小了的提示，直到猜对为止。

//通义：
//#include <stdio.h>
//#include <stdlib.h>
//#include <time.h>
//
//int main()
//{
//	int guess = 0;
//	int answer = 0;
//	int count = 0;
//
//	srand((unsigned int)time(NULL));
//	answer = rand() % 100 + 1;
//
//	printf("Please input a number between 1 and 100:\n");
//	scanf("%d", &guess);
//
//	while (guess != answer)
//	{
//		if (guess > answer)
//		{
//			printf("Your guess is too big.\n");
//		}
//		else
//		{
//			printf("Your guess is too small.\n");
//		}
//	}
//}


//teach：
//C语言提供的随机数函数是rand()，它返回一个0到RAND_MAX（32767）之间的整数。
//需要使用#include <stdlib.h>头文件。
//RAND_MAX是定义在limits.h中的，表示随机数的最大值。
//RAND_MAX的值可能因平台而异，但通常为32767。
// 
//rand函数会返回一个伪随机数（不是真正的随机数，而是通过算法生成的，真正的随机是不可预测的）
// 
//为了得到一个范围在0到99之间的随机数，我们可以使用rand() % 100，
//因为%运算符可以得到一个数的余数，所以%100得到的结果就是0到99之间的数。
//为了得到一个范围在1到100之间的随机数，我们可以使用rand() % 100 + 1，


#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//int main()
//{
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//每次运行完后输出的随机数一样
	//因为每次运行程序时，系统会初始化一个随机数种子，
	//rand函数对一个叫“种子”的基准值进行运算生成随机数
	//之所以会每次运行程序时，输出的随机数相同，是因为rand函数生成随机数的默认种子是 1。
	// 
	// 
	//这个种子就是rand()函数的参数，
	//每次运行程序时，这个种子都会被初始化，
	//所以每次运行程序时，输出的随机数都是相同的。
	// 
	// 
	//要生成不同的随机数，需要使用 srand() 函数来设置随机数种子，
	//它的参数就是随机数种子的值，
	//通常使用当前时间作为随机数种子，
	//这样每次运行程序时，就会得到不同的随机数。
	// 
	//调用rand函数之前，需要调用srand函数来设置随机数种子，
	//srand函数没有返回值，有一个参数，就是随机数种子的值。
	//

	//=========================================================================

	//srand(2);//参数需要一个变化的值，不一定是随机值
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());


	//电脑中的时间是变化的，所以每次运行程序时，得到的随机数都是变化的。
	//在程序中一般使用程序运行时间作为随机数种子，
	// 
	// 在C语言中，可以使用time函数来获取当前时间，
	//time函数返回一个long类型的值，
	//所以每次运行程序时，得到的时间都是变化的。
	// 
	//time函数返回的其实是1970年1月1日0时0分0秒到当前程序运行时间的差值，单位是秒。
	//返回值类型是time_t类型，本质上是32位或64位整型
	//相当于long或者long long类型的别名，
	//所以time函数返回的值是long或者long long类型的值，
	// 
	// time函数的参数 timer 如果是非NULL的指针的话，函数也会将这个返回的差值放在timer指向的内存中带回去。
	//如果 timer 是 NULL，就只返回这个时间的差值。
	//time函数返回的这个时间差也被叫做 : 时间戳。（像邮戳一样）就是一个时间点
	//time函数的时候需要包含头文件 : time.h

	//time_t == long long
	//NULL --> 用来初始化变量 == 0

	//srand((unsigned int)time(NULL));//将long long类型强制转换为unsigned int类型
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());
	//printf("%d\n", rand());

	//程序运行起来后，不管生成多少个随机数，只需要设置一次随机数生成的种子。即srand( )只调用一次

	//=========================================================================

	//随机数范围设置
	//rand()%100;	//0~99
	//rand()%100+1;	//1~100
	//srand((unsigned int)time(NULL));
	//printf("%d\n", rand() % 100 + 1);
	//printf("%d\n", rand() % 100 + 1);
	//printf("%d\n", rand() % 100 + 1);
	//printf("%d\n", rand() % 100 + 1);
	//printf("%d\n", rand() % 100 + 1);

	//100~200的随机数
	//100 + rand() % (200 - 100 + 1);
	//余数范围0~100， + 100 == 100~200

	//a~b的随机数
	//a + rand() % (b - a + 1);

	
	//但是，如果每次运行程序时，得到的随机数都是变化的，
	//那程序中怎么判断用户输入的数字是否正确呢？
	// 
	//答案是使用while循环，
	//在循环中，每次输入一个数字，
	//如果输入的数字正确，则跳出循环，
	//如果输入的数字不正确，则继续循环，
	//直到输入的数字正确为止。

	//return 0;
//}





//==========================================================================

//如果玩完一次之后，还要继续玩，不退出程序
//设置菜单：
//1.开始游戏
//0.退出游戏

//菜单：
void menu()
{
	printf("**********************************\n");
	printf("**********  1.开始游戏  **********\n");
	printf("**********  0.退出游戏  **********\n");
	printf("**********************************\n\n");
}

void game()
{
	//srand((unsigned int)time(NULL));
	//种子设置一次就可以，不需要每次循环都重新设置，频繁调用反而有问题（算法缘故），因此将其放到main函数中

	//1.生成随机数
	int r = rand() % 100 + 1;
	//printf("%d\n", r);

	//2.猜数字
	int guess = 0;

	//方案一：
/*	
	printf("请输入猜测的数字：");
	scanf("%d", &guess);


	while (guess != r)
	{
		if (guess > r)
		{
			printf("猜大了，请重新输入：");
			scanf("%d", &guess);
		}
		else if (guess < r)
		{
			printf("猜小了，请重新输入：");
			scanf("%d", &guess);
		}
	}

    printf("恭喜你，猜对了！");
*/

    //方案二：
/*
	printf("请输入猜测的数字：");
	while (1)
	{
       
        scanf("%d", &guess);
        if (guess == r)
        {
            printf("恭喜你，猜对了！\n");
            break;
        }
        else if (guess > r)
        {
            printf("猜大了，请重新输入：");
        }
        else if (guess < r)
        {
            printf("猜小了，请重新输入：");
        }
	}
*/

	//方案三：
	int count = 5;
	
	
	while (count)
	{
		printf("目前还有%d次机会\n", count);
		printf("猜测的数字：");
		scanf("%d", &guess);
		if (guess == r)
		{
			printf("恭喜你，猜对了！\n");
			break;
		}
		else if (guess > r)
		{
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			printf("猜小了\n");
		}
		count--;
	}

	if (count <= 0)
	{
		printf("游戏结束，你没有机会了，同志。\n");
		printf("正确答案是：%d\n", r);
	}


}


int main()
{
   
	srand((unsigned int)time(NULL));
	//菜单至少运行一次
	int choice = 0;
	do
	{
		system("cls");//清屏

		//打印菜单
		menu();

		printf("请选择：");
		scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("开始游戏\n");
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }

        system("pause");//暂停

	} while (choice);//0退出，非0继续


	return 0;
}